package com.example.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;


//String：字符串类型是 Redis 最基本的数据类型，可以存储任意类型的字符串，包括二进制数据。
//        List：列表类型是一种有序的元素集合，支持从头部或尾部添加或删除元素，支持获取某个元素的值。
//        Hash：散列类型是 Redis 中用来表示对象的数据结构，每个键值对存储一个子对象，适合存储较为复杂的数据结构。
//        Set：集合类型是 Redis 中提供了无序元素的集合，一个键值对可以包含多个元素且元素不能重复，适合存储无序相关元素的数据结构。
//        Sorted Set：有序集合类型是 Redis 中提供了具有排序功能的集合类型，一个键值对可以包含多个元素且元素不能重复，


@RestController
@RequestMapping("/redis")
public class RedisController {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private RedisTemplate<String, Object> redisListTemplate;


    @GetMapping("/setString")
    public String setString() {
        String key = "name";
        String value = "Redis";
        stringRedisTemplate.opsForValue().set(key, value);
        return "set success";
    }

    @GetMapping("/getString")
    public String getString() {
        String key = "name";
        Object value = stringRedisTemplate.opsForValue().get(key);
        return "get value：" + value.toString();
    }

    @GetMapping("/setList")
    public String setList() {
        String key = "list";
        List<String> values = Arrays.asList("Redis", "Java", "Python");
        redisListTemplate.opsForList().rightPushAll(key, values);
        String key2 = "list2";
        List<String> values2 = Arrays.asList("Redis2", "Java2", "Python2");
        redisListTemplate.opsForList().rightPushAll(key2, values2);
        return "set success";
    }

    @GetMapping("/getList")
    public String[] getList() {
        String key = "list";
        List<Object> values = redisListTemplate.opsForList().range(key, 0, -1);
        String[] listRes=new String[values.size()];
        values.toArray(listRes);
        return listRes;
    }

    @GetMapping("/setHash")
    public String setHash() {
        String key = "user";
        stringRedisTemplate.opsForHash().put(key, "name", "Redis");
        stringRedisTemplate.opsForHash().put(key, "age", "18");
        return "set success";
    }

    @GetMapping("/getHash")
    public Map<Object, Object> getHash() {
        String key = "user";
        Map<Object, Object> result = stringRedisTemplate.opsForHash().entries(key);
        return result;
    }

    @GetMapping("/setSet")
    public String setSet() {
        String key = "set";
        stringRedisTemplate.opsForSet().add(key, "Redis", "Java", "Python");
        return "set success";
    }

    @GetMapping("/getSet")
    public Set<String> getSet() {
        String key = "set";
        Set<String> resultA = stringRedisTemplate.opsForSet().members(key);
        return resultA;
    }
}
